package com.example.ai.mapper;


import com.example.ai.annotation.AutoFill;
import com.example.ai.entity.Good;
import com.example.ai.entity.Order;
import com.example.ai.entity.getLastDTO;
import com.example.ai.entity.item;
import com.mongodb.client.model.changestream.OperationType;
import org.apache.ibatis.annotations.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单管理Mapper接口
 * 提供订单信息的CRUD操作及订单相关统计功能
 *
 * @author czwa
 */
@Mapper
public interface OrderMapper {

    /**
     * 新增订单
     * 自动填充创建时间和创建者信息
     *
     * @param order 订单实体对象
     */
    @AutoFill(OperationType.INSERT)
    void addOrder(Order order);

    /**
     * 获取今日营收金额
     * 查询条件：今日创建且状态为已完成(3)的订单
     *
     * @return 今日营收总金额
     */
    @Select("select sum(expend) from orders where date(create_time)=date(now()) and status=3")
    Double getTodayRevenue();

    /**
     * 获取今日订单总数
     * 查询条件：今日创建且状态为已支付(1)或已完成(3)的订单
     *
     * @return 今日订单总数
     */
    @Select("select count(id) from orders where date(create_time)=date(now()) and status in(1,3)")
    Integer getTotalOrders();

    /**
     * 获取今日已完成订单数
     * 查询条件：今日创建且状态为已完成(3)的订单
     *
     * @return 今日已完成订单数
     */
    @Select("select count(id) from orders where date(create_time)=date(now()) and status=3")
    Integer getCompletedOrders();

    /**
     * 获取未完成订单列表
     * 查询条件：状态为已支付(1)的订单
     *
     * @return 未完成订单列表
     */
    @Select("select id, information, expend, create_time, creator, status, user_id from orders where status=1")
    List<Order> getUnfinishedOrder();

    /**
     * 更新商品库存
     * 根据订单商品项扣减对应商品库存
     *
     * @param items 订单商品项数组
     */
    void updateStock(item[] items);

    /**
     * 更新订单状态为已完成(3)
     *
     * @param id 订单ID
     */
    @Update("update orders set status=3 where id=#{id}")
    void updateOrder(Integer id);

    /**
     * 添加订单商品关联记录
     *
     * @param order 订单实体对象
     */
    void addOrderGood(@Param("order") Order order);

    /**
     * 根据订单ID获取商品列表
     *
     * @param id 订单ID
     * @return 商品列表（包含消费数量）
     */
    @Select("select g.id as id,og.consume as stock from order_good og left join good g on og.good_id = g.id where og.order_id=#{id}" )
    List<Good> getGoodsByOrderId(int id);

    /**
     * 批量更新商品库存
     *
     * @param goods 商品列表（包含需要更新的库存数量）
     */
    void updateGoodStock(List<Good> goods);

    /**
     * 更新订单状态为已发货(2)
     *
     * @param id 订单ID
     */
    @Update("update orders set status=2 where id= #{id}")
    void updateOrderStatus2(int id);

    /**
     * 根据ID获取订单详情
     *
     * @param orderId 订单ID
     * @return 订单实体对象
     */
    @Select("select id, information, expend, create_time, creator, status, user_id from orders where id=#{orderId}")
    Order getById(int orderId);

    /**
     * 处理超时未支付订单
     * 删除创建时间早于指定标准且状态为未支付(0)的订单
     *
     * @param standard 时间标准
     */
    @Delete("delete from orders where status=0 and create_time < #{standard}")
    void processTimeoutOrder(LocalDateTime standard);

    /**
     * 获取超时未支付订单ID列表
     * 查询条件：创建时间早于指定标准且状态为未支付(0)的订单
     *
     * @param standard 时间标准
     * @return 超时订单ID数组
     */
    @Select("select id from orders where status=0  and create_time < #{standard}")
    Integer[] getProcessTimeoutOrderIds(LocalDateTime standard);

    /**
     * 处理订单商品关联表中的超时订单
     * 删除超时未支付订单的商品关联记录
     *
     * @param ids 超时订单ID数组
     */
    void processTimeoutOrderInOrderGood(Integer[] ids);

    /**
     * 获取指定日期范围内的商品总数
     *
     * @param getLastDTO 日期范围DTO（包含开始日期和结束日期）
     * @return 商品总数
     */
    @Select("select count(distinct good_id) as counts " +
            "from order_good og " +
            "left join orders o " +
            "on og.order_id=o.id " +
            "where date(o.create_time) between #{startDate} and #{endDate}")
    int getTotalGoods(getLastDTO getLastDTO);

    /**
     * 根据商品名称查询商品
     *
     * @param goodName 商品名称
     * @return 商品实体对象
     */
    @Select("select * from good where name = #{goodName}")
    Good selectByName(String goodName);
}